package clases;

import java.awt.Component;
import java.awt.Event;
import java.awt.event.KeyEvent;
import javax.swing.*;

public class ClsContraladorEventos {

    static int[] caracterAscii = {
        32,// Espacio
        34,// " comillas
        35,// # simbolo michi
        37,// % porcentaje
        39,// ' apostrofe
        40,// ( parentesis de apertura
        41,// ) parentesis de cierre
        43,// + simbolo de suma
        44,// , coma
        45,// - guion
        46,// . punto
        47,// / splash
    };
    static int[] caracterAscii_v2 = {
        50,// " comillas
        51,// # simbolo michi
        52,// $ simbolo de dolar
        //        37,// % porcentaje
        //        38,// & ampersand
        //        39,// ' apostrofe
        //        40,// ( parentesis de apertura
        41,// ) parentesis de cierre
        42,// * asterisco
        521,// + simbolo de suma
        44,// , coma
        45,// - guion
        46,// . punto
        47,// / splash
        58,// :
        59,// ;
        167// °
    };

    public void soloNumero(KeyEvent e) {
        int t = e.getKeyChar();
        if (t < 48 || t > 57) {
            e.consume();
        }
    }

    public void letras(KeyEvent e) {
        char c = e.getKeyChar();
        if ((c >= 47) && (c <= 58)) {
            e.consume();
        }
    }

    public void letrasNumeros_OtrosCaracteres(KeyEvent e) {
        char c = e.getKeyChar();
        boolean value = false;
        if ((c > 47) && (c < 58)) {//Es un Numero
            value = true;
        } else if ((c >= 65 || c <= 90) || (c >= 97 || c <= 122)) {//Es una Letra
//            e.consume();
            value = true;
        } else {// Es un caracter definido en "caracterAscii[]"
            for (int i = 0; i < caracterAscii.length; i++) {
                if (c == caracterAscii[i]) {
                    value = true;
                    break;
                }
            }
        }
        if (value == false) {
            e.consume();
        }
    }

    public boolean letrasNumeros_OtrosCaracteres_v2Table(KeyEvent e) {
        char c = e.getKeyChar();
        boolean value = false;
        if ((c > 47) && (c < 58)) {//Es un Numero
            value = true;
        } else if ((c >= 65 || c <= 90) || (c >= 97 || c <= 122)) {//Es una Letra
//            e.consume();
            value = true;
        } else {// Es un caracter definido en "caracterAscii[]"
            for (int i = 0; i < caracterAscii_v2.length; i++) {
                if (c == caracterAscii_v2[i]) {
                    value = true;
                    break;
                }
            }
        }
//        if (value==false) {
//            e.consume();
//        }
        if (value) {
            System.err.println("e=" + e.getKeyCode());
        }
        return value;
    }
//___________________________________________________________________________________ Soy una barra separadora :)

    public void nCaracteres(KeyEvent e, JTextField caja, int cantidad) {
        int t = e.getKeyChar();
        if (caja.getText().length() >= cantidad) {
            e.consume();
        }
    }

    public void mayusculas(JTextField tx) {
        tx.setText(tx.getText().toUpperCase());
    }

    public void minusculas(JTextField txTextField) {
        txTextField.setText(txTextField.getText().toLowerCase());
    }

    // *********************************************************  
    public void numero1Punto_2Decimal(KeyEvent e, JTextField tx) {
        if (e.getKeyCode() != 8) {
            int t = e.getKeyChar();
            if (t == 46) {
                soloNumerosDecimales(e, tx);
            } else {
                if (t < 48 || t > 57) {
                    e.consume();
                }
                boolean b = false;
                int l = tx.getText().length();
                int i = 0;
                for (i = 0; i < l - 2; i++) {
                    if (tx.getText().charAt(i) == '.') {
                        b = true;
                        i = l;
                    }
                }
                if (b == true) {
                    e.consume();
                }
            }
        }
    }

    /**
     * Este metodo se debe de implementar en un JTextField con el evento
     * KeyTyped para obtener un buen funcionamiento
     *
     * @param e el Evento de un JTextField
     * @param textField el JTextField el cual se aplicara el .consume() si se
     * cumple...
     */
    public void soloNumerosDecimales(KeyEvent e, JTextField textField) {
        char c = e.getKeyChar();
        if (e.getKeyCode() != 8) {//Si es diferente de la Tecla BACKSPACE
            int positionPunto = textField.getText().toString().indexOf(".");
            if (c == 46) {// Si es punto .
                if (textField.getText().toString().indexOf(".") >= 0) { //buscamos el punto
                    e.consume();
                } else if (textField.getText().length() == 0) {// si se presiona punto al iniciao
                    textField.setText("0");//Se le coloca el cero, y luego se agrega el punto ej: "0."
                }
            } else if (c < 48 || c > 57) {//Diferente de un Numero
                e.consume();
            } else if ((c >= 48 || c <= 57) && positionPunto > 0) {//Pero si es un Numero
                //Verificamos que se aya seleccionado algun numero
                //SI es asi se quiere decir que el user quiere sobreescribir dicho numero seleccionado...
                if (textField.getSelectionEnd()-textField.getSelectionStart()==0) {
                    e.consume();
                }
            }
        }
    }

    /**
     * Este metodo se debe de implementar en un JTextField con el evento
     * KeyTyped para obtener un buen funcionamiento
     *
     * @param e el Evento de un JTextField
     * @param textField el JTextField el cual se aplicara el .consume() si se
     * cumple...
     * @param cantidadDecimales la cantidad de decimales despues del punto
     */
    public void soloNumerosDecimales(KeyEvent e, JTextField textField, int cantidadDecimales) {
        char c = e.getKeyChar();        
        if (e.getKeyCode() != 8) {//Si es diferente de la Tecla BACKSPACE
            int positionPunto = textField.getText().toString().indexOf(".");
            if (c == 46) {// Si es punto .
                if (textField.getText().toString().indexOf(".") >= 0) { //buscamos el punto
                    e.consume();
                } else if (textField.getText().length() == 0) {// si se presiona punto al iniciao
                    textField.setText("0");//Se le coloca el cero, y luego se agrega el punto ej: "0."
                }
            } else if (c < 48 || c > 57) {//Diferente de un Numero                
                e.consume();
            } else if ((c >= 48 || c <= 57) && positionPunto > 0) {//Pero si es un Numero
                int length = textField.getText().length();
                //Verificamos que se aya seleccionado algun numero
                //SI es asi se quiere decir que el user quiere sobreescribir dicho numero seleccionado...
                if (textField.getSelectionEnd()-textField.getSelectionStart()==0) {
                    //Verificamos la cantidad de Caracteres
                    if (length - positionPunto == cantidadDecimales + 1) {
                        e.consume();
                    }
                }
            }
        }
    }

    public boolean verifica_texto(JTextField tx) {
        boolean val = true;
        if (tx.getText().trim().length() == 0) {
            val = false;
        }
        return val;
    }

    /**
     * Permitira controlar la cantidad de caracteres deseado. Ej: que el
     * JTextField solo acepte 4 caracteres como maximo. SE DEBE implementar este
     * metodo en el EVENTO KeyTyped de un JTextField
     *
     * @param e el evento
     * @param textField hace referencia al JTextField
     * @param cantidadMaxima la cantidad maxima que se debe ingresar al
     * JTextField
     */
    public void cantidadMaximaCaracteresJTextField(KeyEvent e, JTextField textField, int cantidadMaxima) {
        int length = textField.getText().length();
        if (length + 1 > cantidadMaxima) {
            e.consume();
        }
    }

    /**
     * Permitira controlar la cantidad de caracteres deseado Ej: que el
     * JTextArea solo acepte 4 caracteres como maximo. SE DEBE implementar este
     * metodo en el EVENTO KeyTyped de un JTextArea
     *
     * @param e el evento
     * @param textArea hace referencia al JTextArea
     * @param cantidadMaxima la cantidad maxima que se debe ingresar al
     * JTextArea
     */
    public void cantidadMaximaCaracteresJTextArea(KeyEvent e, JTextArea textArea, int cantidadMaxima) {
        int length = textArea.getText().length();
        if (length + 1 > cantidadMaxima) {
            e.consume();
        }
    }

    public void elimina_copiar(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_V
                && e.getKeyCode() == KeyEvent.VK_CONTROL) {
            e.consume();
        }
    }
     public void disablePasteAction(JComponent[] components){

        for (JComponent campo : components){
            InputMap map = campo.getInputMap();
            map.put(KeyStroke.getKeyStroke(KeyEvent.VK_V, Event.CTRL_MASK), "null");
            map.put(KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, Event.SHIFT_MASK), "null");
        }

    }

    public void disableCopyAction(Component[] components){

        for (Component campo : components){

            if(campo instanceof JComponent){
                InputMap map = ((JComponent)campo).getInputMap();
                map.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, Event.CTRL_MASK), "null");
            }
        }
    }
}
